//#include<iostream>
//using namespace std;
//
//template<typename T>
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}
//
//int main()
//{
//	int a = 0, b = 1;
//	double c = 1.1, d = 2.2;
//	char e = 'e', f = 'f';
//
//	Swap(a, b);
//	Swap(c, d);
//	Swap(e, f);
//
//	cout << a << " " << b << endl;
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//template<class T>
//T Add(const T& x, const T& y) 
//{
//	return x + y;
//}
//
//int main()
//{
//	int a1 = 10, a2 = 20;
//	double d1 = 10.1, d2 = 20.2;
//	cout << Add(a1, a2) << endl;
//	cout << Add(d1, d2) << endl;
//
//	cout << Add<int>(a1, d2) << endl;     // 指定T用int类型
//	cout << Add<double>(a1, d2) << endl;  // 指定T用double类型
//
//	return 0;
//}

//#include <iostream>
//using namespace std;

//template<class T1, class T2>
//T1 Add(const T1& x, const T2& y)
//{
//	cout << "T" << endl;
//	return x + y;
//}
//
//int Add(int x, int y)
//{
//	cout << "int" << endl;
//	return x + y;
//}
//
//int main()
//{
//	cout << Add(1, 2) << endl;     // 用现成的
//	//（与非函数模板类型完全匹配，不需要函数模板实例化）
//
//	cout << Add(1, 2.0) << endl;   // 可以，但不是很合适，自己印更好
//	//（模板参数可以生成更加匹配的版本，编译器根据实参生产更加匹配的Add函数）
//
//	return 0;
//}


template<class T>
class Stack
{
public:
	Stack(T capacity = 4)
		: _top(0)
		, _capacity(capacity)
	{
		_arr = new T[capacity];
	}

	~Stack();// 让析构函数放在类外定义
private:
	T* _arr;
	int _top;
	int _capacity;
};

// 类模板中函数放在类外进行定义时，需要加模板参数列表
template <class T>
Stack<T>::~Stack() // Stack是类名，不是类型，Stack<T> 才是类型，
{
	delete[] _arr;
	_arr = nullptr;
	_capacity = _top = 0;
}

int main()
{
	return 0;
}
